package com.example.demo.suanfa_sort;

/**
 * @program: java_base
 * @description: 给定一组数，一个数出现了k次，领一些数出现了m次 ;k<m
 * @author: zhouhongtao
 * @happyCreateTime: 2022/03/07 09:33
 */
public class KMDemo {


    /**
     * 保证arr中，只有一种数出现了k次，其他数都出现了m次
     *
     * @param arr
     * @param k
     * @param m
     * @return
     */
    public static int onlyKTimes(int[] arr, int k, int m) {
        int[] t = new int[32];
        // t[0] 0位置表示的1出现了几个
        // t[i] i位置的i出现了几次
        for (Integer num : arr) {
            // 代表在i位置是1
            // 记录 每个整形数的 每个2进制位 1 的情况
            for (int i = 0; i <= 31; i++) {
                t[i] += ((num >> 1) & 1);
            }
        }
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            t[i] %= m;
            if (t[i]!=0){
                ans |= 1 << i;
            }
        }
        // ans 为答案
        // 要想知道出现几次，k
        int kTimes = 0;
        for(int num : arr){
            if (num == ans){
                kTimes++;
            }
        }
        return kTimes == k ? ans : -1;
    }

}
